home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A)[a].zip / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A)[a].po / ARTIST.T.txt < prev    next >
Text File  |  1996-12-24  |  10KB  |  388 lines

  1. **************************************************
  2. *                                                *
  3. *              ARTIST Source Code                *
  4. *                                                *
  5. *             by S. Scott Zimmerman              *
  6. *              Copyright (c) 1988                *
  7. *              by MicroSPARC, Inc                *
  8. *              Concord, MA  01742                *
  9. *                                                *
  10. *           The MicroSPARC Assembler             *
  11. *                                                *
  12. **************************************************
  13.  
  14.  ORG $8000 ;Decimal 32768
  15.  
  16. **************************************************
  17. *  EQUates:                                      *
  18. **************************************************
  19.  
  20. XALT EQU $04 ;Altern X position
  21. SCRNNUM EQU $06 ;Scrn num for HRCOMP
  22. LENGTH EQU $08 ;Length of compact pict
  23. CH EQU $24 ;Cursor horizontal
  24. COMPTR EQU $1E ;Compact start
  25. XPOS EQU $CE ;Cursor X position
  26. YALT EQU $E3 ;Altern Y position
  27. YPOS EQU $FA ;Cursor Y position
  28. FLSHDEL EQU $FB ;Flash delay
  29. MSGPTR EQU $FE ;Message pointer
  30. HREXP EQU $300 ;Expander routine
  31. APLSOFT EQU $3D0 ;Aplsoft warm start
  32. COMPIC EQU $4000 ;Compressed picture
  33. HRCOMP EQU $6000 ;Compactor routine
  34. KEYBD EQU $C000 ;Keyboard input
  35. STROBE EQU $C010 ;Clear keyboard strobe
  36. XDRAW EQU $F65D ;XOR shape onto scrn
  37. PRNTAX EQU $F941 ;Print hex number
  38. SETTXT EQU $FB39 ;Set text mode
  39. TABV EQU $FB5B ;Vertical tab routine
  40. HOME EQU $FC58 ;Clear text screen
  41. CROUT EQU $FD8E ;Output carriage return
  42. COUT EQU $FDED ;Output a character
  43. *------------------------------------------------*
  44. ESC EQU $9B ;Escape code
  45. LARR EQU $88 ;Left arrow code
  46. DARR EQU $8A ;Down arrow code
  47. UARR EQU $8B ;Up arrow code
  48. RARR EQU $95 ;Right arrow code
  49. DELVAL EQU $2000 ;Delay value
  50.  
  51. **************************************************
  52. *  Hi-Res Graphics ROM routines and switches:    *
  53. **************************************************
  54.  
  55. ROT EQU $F9 ;Shape rotation
  56. HPAG EQU $E6 ;Hi-Res page ($20/$32)
  57. SCALE EQU $E7 ;Shape scale
  58. SHOW EQU $C050 ;Display graphics scrn
  59. FULLSCRN EQU $C052 ;Display full scrn
  60. MXEDSCRN EQU $C053 ;Display mixed gr/txt
  61. FLIP1 EQU $C054 ;Display screen #1
  62. HRSCRN EQU $C057 ;Display Hi-Res gr
  63. HCLR EQU $F3F2 ;Clear Hi-Res screen
  64. HPOSN EQU $F411 ;Position HR cursor
  65. HPLOT EQU $F457 ;Plot a pixel
  66. HLIN EQU $F53A ;Draw a line
  67. SETHCOL EQU $F6EC ;Set HR color
  68.  
  69. **************************************************
  70. *  Initialize:                                   *
  71. **************************************************
  72.  
  73.  LDA #0 ;Set things to zero
  74.  STA XALT ;Alt cursor
  75.  STA XALT+1
  76.  STA YALT
  77.  STA CURSFLG ;Init cursor flag
  78.  STA ROT ;Set rotation to 0
  79.  STA SCRNNUM ;Set to page 1
  80.  STA PENFLG ;Set to pen up
  81.  STA FMFLG ;Set to mixed
  82.  STA XPOS+1 ;Clear HOB of X pos
  83.  STA LENGTH ;Init to no length
  84.  STA LENGTH+1
  85.  LDA #140 ;Set main cursor pos
  86.  STA XPOS
  87.  LDA #96 ;Set Y position
  88.  STA YPOS
  89.  LDX #3 ;Set color to white
  90.  JSR SETHCOL ;Call to set color
  91.  LDA #1 ;Set the scale to 1
  92.  STA SCALE
  93.  LDA #$20 ;Set HR page 1
  94.  STA HPAG
  95.  JSR HCLR ;Clear HR screen
  96.  JSR HOME ;Clear text scrn
  97.  JSR PRNTMENU ;Print menu
  98.  BIT HRSCRN ;Select hi-res screen
  99.  BIT FLIP1 ;Make sure it's pg 1
  100.  BIT MXEDSCRN ;Set to mixed scrn
  101.  BIT SHOW ;Show HR screen
  102.  BIT STROBE ;Clear kb strobe
  103.  JSR PLOTCURS ;Plot the cursor
  104.  
  105. **************************************************
  106. *  Start ARTIST main loop:                       *
  107. **************************************************
  108.  
  109. MAINLOOP BIT KEYBD ;Keypressed?
  110.  BMI GETKEY ;Yes, get key
  111.  JMP NOHIT ;No, proceed
  112. GETKEY LDA KEYBD ;Get key
  113.  BIT STROBE ;Clear keybd strobe
  114.  PHA ;Save keyboard input
  115.  LDA CURSFLG ;Is flag on?
  116.  BEQ CHECKIN ;No, just check input
  117.  JSR PLOTCURS ;Yes, erase cursors
  118. CHECKIN PLA ;Restore input
  119.  CMP #RARR ;Right arrow?
  120.  BNE NEXT1 ;No, check next
  121.  INC XPOS ;Move right a pixel
  122.  BNE ]A
  123.  INC XPOS+1
  124. ]A LDA XPOS ;Is it too high?
  125.  CMP #280 ;Past 279?
  126.  LDA XPOS+1
  127.  SBC #280/
  128.  BCC SETNEW ;No, just set new
  129.  LDA #0 ;Yes, wrap back to 0
  130.  STA XPOS
  131.  STA XPOS+1
  132. SETNEW JSR PLOT ;If pen down, plot point
  133.  JSR PLOTCURS ;Go turn cursor on
  134.  JMP MAINLOOP
  135. NEXT1 CMP #LARR ;Left arrow?
  136.  BNE NEXT2 ;No, check next
  137.  LDA XPOS ;Is it at zero?
  138.  ORA XPOS+1
  139.  BNE ]A ;No, so decrement
  140.  LDA #279 ;Yes, so wrap
  141.  STA XPOS
  142.  LDA #279/
  143.  STA XPOS+1
  144.  BNE SETNEW ;Always
  145. ]A LDA XPOS ;Decrement X
  146.  BNE ]B
  147.  DEC XPOS+1
  148. ]B DEC XPOS
  149.  JMP SETNEW ;Go set new pos
  150. NEXT2 CMP #UARR ;Up arrow?
  151.  BNE NEXT3 ;No, check next
  152.  LDA YPOS ;Is it at zero?
  153.  BNE ]A ;No, so decrement
  154.  LDA #191 ;Yes, so wrap
  155.  STA YPOS
  156.  JMP SETNEW ;Go set new pos
  157. ]A DEC YPOS ;Decrement Y
  158.  JMP SETNEW ;Go set new pos
  159. NEXT3 CMP #DARR ;Down arrow?
  160.  BNE NEXT4 ;No, check next
  161.  INC YPOS ;Go down one pixel
  162.  LDA YPOS ;Get current value
  163.  CMP #192 ;Is it past bottom?
  164.  BNE OKAY ;No, it's okay
  165.  LDA #0 ;Yes, set to top
  166.  STA YPOS
  167. OKAY JMP SETNEW ;Go set new pos
  168. NEXT4 CMP #"0 ;Input a number?
  169.  BCC NEXT5 ;Too low
  170.  CMP #"8 ;Is it too high?
  171.  BCS NORMKEY ;Yes, go check next
  172.  SEC ;Prepare to subtract
  173.  SBC #"0 ;Subtract ASCII for 0
  174.  TAX ;Put color in X
  175.  JSR SETHCOL ;Set new color
  176.  JMP MAINLOOP
  177. NEXT5 CMP #ESC ;Undo last screen
  178.  BNE NORMKEY ;No, proceed
  179.  JSR RESTORE ;Restore from save
  180.  JMP MAINLOOP
  181. NORMKEY AND #%11011111 ;Conv lower->upper
  182.  CMP #"I ;Aux cursor up?
  183.  BNE CHKJ ;No, go check J
  184.  LDA YALT ;Is it at zero?
  185.  BNE ]A ;No, so decrement
  186.  LDA #191 ;Yes, so wrap
  187.  STA YALT
  188.  JMP SETNEW ;Go set new pos
  189. ]A DEC YALT ;Decrement Y
  190.  JMP SETNEW ;Go set new pos
  191. CHKJ CMP #"J ;Aux cursor left?
  192.  BNE CHKK ;No, go check K
  193.  LDA XALT ;Is it at zero?
  194.  ORA XALT+1
  195.  BNE ]A ;No, so decrement
  196.  LDA #279 ;Yes, so wrap
  197.  STA XALT
  198.  LDA #279/
  199.  STA XALT+1
  200.  BNE OKAY ;Always
  201. ]A LDA XALT ;Decrement X
  202.  BNE ]B
  203.  DEC XALT+1
  204. ]B DEC XALT
  205.  JMP SETNEW ;Go set new pos
  206. CHKK CMP #"K ;Aux cursor right?
  207.  BNE CHKM ;No, go check M
  208.  INC XALT ;Move right a pixel
  209.  BNE ]A
  210.  INC XALT+1
  211. ]A LDA XALT ;Is it too high?
  212.  CMP #280 ;Past 279?
  213.  LDA XALT+1
  214.  SBC #280/
  215.  BCC OK ;No, just set new
  216.  LDA #0 ;Yes, wrap back to 0
  217.  STA XALT
  218.  STA XALT+1
  219.  BEQ OK ;Always branch
  220. CHKM CMP #"M ;Aux cursor down?
  221.  BNE CHKF ;No, go check F
  222.  INC YALT ;Go down one pixel
  223.  LDA YALT ;Get current value
  224.  CMP #192 ;Is it past bottom?
  225.  BNE OK ;No, it's okay
  226.  LDA #0 ;Yes, set to top
  227.  STA YALT
  228. OK JMP SETNEW ;Go set new pos
  229. CHKF CMP #"F ;Full/mixed toggle?
  230.  BNE CHKL ;No, go check L
  231.  LDA FMFLG ;Get full/mixed flag
  232.  EOR #1 ;Toggle it
  233.  STA FMFLG ;Save result
  234.  BNE SETFULL ;Go set to full
  235.  BIT MXEDSCRN ;Set to mixed
  236.  JMP MAINLOOP
  237. SETFULL BIT FULLSCRN ;Set to full
  238.  JMP MAINLOOP
  239. CHKL CMP #"L ;Draw line?
  240.  BNE CHKC ;No, go check C
  241.  JSR SAVE ;Save current screen
  242.  LDY XPOS+1 ;Get cursor position
  243.  LDX XPOS
  244.  LDA YPOS
  245.  JSR HPOSN ;Set that position
  246.  LDX XALT+1 ;Get alt cursor pos
  247.  LDA XALT
  248.  LDY YALT
  249.  JSR HLIN ;Draw a line
  250.  JMP MAINLOOP
  251. CHKC CMP #"C ;Clear screen?
  252.  BNE CHKP ;No, go check P
  253.  JSR SAVE ;Save current screen
  254.  JSR HCLR ;Clear graphics scrn
  255.  JMP MAINLOOP
  256. CHKP CMP #"P ;Toggle pen up/down?
  257.  BNE CHKQ ;No, go check Q
  258.  JSR SAVE ;Save current screen
  259.  LDA PENFLG ;Get current setting
  260.  EOR #1 ;Toggle 0 <--> 1
  261.  STA PENFLG
  262.  JMP MAINLOOP
  263. CHKQ CMP #"Q ;Quit?
  264.  BEQ QUIT ;Yes
  265. NOHIT INC FLSHDEL ;Increment delay
  266.  BNE ]A
  267.  INC FLSHDEL+1
  268. ]A LDA FLSHDEL ;End of flash delay?
  269.  CMP #DELVAL
  270.  LDA FLSHDEL+1
  271.  SBC #DELVAL/
  272.  BCS BLINK ;Yes, blink cursor
  273.  JMP MAINLOOP
  274. BLINK JSR PLOTCURS
  275.  JMP MAINLOOP
  276. *------------------------------------------------*
  277. QUIT JSR SAVE ;Save the HR screen
  278.  JSR SETTXT ;Set back to text mode
  279.  JSR HOME ;Clear the text screen
  280.  LDX #ADRMSG ;Print address message
  281.  LDY #ADRMSG/
  282.  JSR MESSAGE
  283.  LDA #COMPIC/ ;Get compact address
  284.  LDX #COMPIC
  285.  JSR PRNTAX
  286.  LDX #LENMSG
  287.  LDY #LENMSG/
  288.  JSR MESSAGE
  289.  LDA LENGTH+1 ;Get compact length
  290.  LDX LENGTH
  291.  JSR PRNTAX ;Print hex value
  292.  JSR CROUT ;Carriage return
  293.  JMP APLSOFT
  294.  
  295. **************************************************
  296. *  Auxiliary routines:                           *
  297. **************************************************
  298.  
  299. PLOTCURS LDA CURSFLG ;Get current flag
  300.  EOR #1 ;Toggle 1 <--> 0
  301.  STA CURSFLG
  302.  LDY XPOS+1 ;Set X location
  303.  LDX XPOS
  304.  LDA YPOS ;Set Y location
  305.  JSR HPOSN ;Set its position
  306.  LDA #0 ;Zero rotation
  307.  LDY #CURSOR/ ;Set shape location
  308.  LDX #CURSOR
  309.  JSR XDRAW ;Draw the shape
  310.  LDY XALT+1 ;Set X location
  311.  LDX XALT
  312.  LDA YALT ;Set Y location
  313.  JSR HPOSN ;Set its position
  314.  LDA #0 ;Zero rotation
  315.  LDY #ALTCURS/ ;Set shape location
  316.  LDX #ALTCURS
  317.  JSR XDRAW ;Draw the shape
  318.  LDA #0 ;Zero the flash delay
  319.  STA FLSHDEL
  320.  STA FLSHDEL+1
  321.  RTS
  322. *------------------------------------------------*
  323. PLOT LDA PENFLG ;Is pen on?
  324.  BNE ON ;Yes, so plot
  325.  RTS ;No, so just return
  326. ON LDY XPOS+1 ;Set location
  327.  LDX XPOS
  328.  LDA YPOS
  329.  JMP HPLOT ;Plot the point, return
  330. *------------------------------------------------*
  331. PRNTMENU LDX #0
  332.  STX CH ;Set horiz location
  333.  LDA #20 ;Set verical location
  334.  JSR TABV ;Move cursor there
  335.  LDX #MENUMSG ;Get message address
  336.  LDY #MENUMSG/
  337. MESSAGE STX MSGPTR ;Set message pointer
  338.  STY MSGPTR+1
  339.  LDY #0 ;Init index
  340. MSGLOOP LDA (MSGPTR),Y ;Get character
  341.  BEQ MSGEND ;Quit if zero
  342.  JSR COUT ;Print character
  343.  INY ;Go to next
  344.  BNE MSGLOOP ;Always branch
  345. MSGEND RTS ;End of message
  346. *------------------------------------------------*
  347. SAVE LDA #COMPIC ;Set address of compact
  348.  STA COMPTR
  349.  LDA #COMPIC/
  350.  STA COMPTR+1
  351.  JSR HRCOMP
  352.  RTS
  353. *------------------------------------------------*
  354. RESTORE LDA LENGTH ;Is a compact pict there?
  355.  ORA LENGTH+1
  356.  BNE RES ;Yes, restore it
  357.  RTS ;No, just return
  358. RES JSR HCLR ;Clear current screen
  359.  LDA #COMPIC ;Set compact pict adrs
  360.  STA COMPTR
  361.  LDA #COMPIC/
  362.  STA COMPTR+1
  363.  JSR HREXP
  364.  RTS
  365.  
  366. **************************************************
  367. *  Data:                                         *
  368. **************************************************
  369.  
  370. MENUMSG ASC "ESC=UNDO  0-7=COLOR  F=FULL/MXED"
  371.  ASC "  L=LINE"
  372.  ASC "C=CLEAR SCREEN   Q=QUIT    "
  373.  ASC "P=PEN UP/DOWN"
  374.  ASC "IJKM=MOVE ALT CURSOR  "
  375.  ASC "ARROWS=MOVE CURSOR"
  376.  BRK
  377. ADRMSG ASC "COMPACT PICT: A$"
  378.  BRK
  379. LENMSG ASC ",L$"
  380.  BRK
  381. *------------------------------------------------*
  382. CURSFLG DFS 1 ;0=Cursor off, 1=on
  383. PENFLG DFS 1 ;0=Pen up, 1=down
  384. FMFLG DFS 1 ;0=Mixed, 1=full
  385. *------------------------------------------------*
  386. CURSOR DFC $3A,$24,$2D,$36,$07,$00
  387. ALTCURS DFC $04,$00
  388.